home *** CD-ROM | disk | FTP | other *** search
/ Video Toaster 4.2 / Video Toaster v4.2.iso / arexx / modeler / wraptosphere.lwm < prev   
Text File  |  1993-12-13  |  2KB  |  82 lines

  1. /*
  2.  * Wrap Data onto Sphere -- Modeler ARexx transform.
  3.  *
  4.  * 8/93  Stuart Ferguson
  5.  */
  6.  
  7.     mxx="LWModelerARexx.port"
  8.     signal on error
  9.     signal on syntax
  10.     check = addlib("rexxmathlib.library",0,-30,0)
  11.     mxx_add = addlib(mxx,0)
  12.     call main
  13.     if (mxx_add) then call remlib(mxx)
  14.     exit
  15.  
  16.     syntax:
  17.     error:
  18.     t=Notify(1,'!Rexx Script Error','@'ErrorText(rc),'Line 'SIGL)
  19.     if (mxx_add) then call remlib(mxx)
  20.     exit
  21.  
  22.  
  23. main:
  24.  
  25. syscode = "Wrap Sphere"
  26.  
  27.  
  28. /* Get size and thickness of sphere from user.
  29.  */
  30. call req_begin syscode
  31.  
  32. id_inr = req_addcontrol("Inner Radius", 'n', 1)
  33. id_otr = req_addcontrol("Outer Radius", 'n', 1)
  34. id_sel = req_addcontrol("Points", 'c', 'All Selected')
  35. call req_setval id_inr, 1.0, 1.0
  36. call req_setval id_otr, 2.0, 2.0
  37. call req_setval id_sel, 2
  38.  
  39. if (~req_post()) then return
  40.  
  41. r1 = req_getval(id_inr)
  42. r2 = req_getval(id_otr)
  43. call sel_mode word('global user',req_getval(id_sel))
  44.  
  45. call req_end
  46.  
  47.  
  48. /* Get extent of data area.  This will just take the extent in
  49.  * X and Y and map it to lat and long on the sphere, and the
  50.  * extent in Z and map it to r1 and r2.
  51.  */
  52. parse value boundingbox() with n x1 x2 y1 y2 z1 z2 .
  53. dx = x2 - x1
  54. dy = y2 - y1
  55. dz = z2 - z1
  56. if (n <= 0 | dx <= 0 | dy <= 0) then return
  57. d2r = 3.1415926 / 180
  58.  
  59. /* Transform loop
  60.  */
  61. n = xfrm_begin()
  62. call meter_begin n, syscode
  63. do i = 1 to n
  64.     parse value xfrm_getpos(i) with x y z .
  65.  
  66.     lat = d2r * ((y - y1) / dy * 180 - 90)
  67.     lon = d2r * ((x - x1) / dx * 360)
  68.     if (dz <= 0) then rad = r1
  69.                  else rad = (z - z1) / dz * (r2 - r1) + r1
  70.  
  71.     y = rad * sin(lat)
  72.     p = rad * cos(lat)
  73.     x = p * sin(lon)
  74.     z = p * cos(lon)
  75.  
  76.     call xfrm_setpos i, x y z
  77.     call meter_step
  78. end
  79. call meter_end
  80. call xfrm_end
  81.  
  82. return